package com.ssyt.jfinal.core.common;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.FakeStaticHandler;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.ViewType;
import com.ssyt.jfinal.core.article.ArticleController;
import com.ssyt.jfinal.core.common.model._MappingKit;
import com.ssyt.jfinal.core.user.CategoryController;

/**
 * API引导式配置
 *
 * @author Hsu。
 * @since Jan 9, 2017
 */
public class Config extends JFinalConfig {

    /**
     * 配置常量
     */
    @Override
    public void configConstant(Constants me) {
        // 1、读取数据库配置
        // loadPropertyFile("config.properties");
        PropKit.use("config.properties");
        // getPropertyToBoolean("devMode", false);
        // 2、是否为开发者模式，默认为false
        me.setDevMode(PropKit.getBoolean("devMode", false));
        // 3、设置视图类型，默认是FREE_MARKER
        me.setViewType(ViewType.JSP);
        // 4、设置视图的默认寻找路径
        // me.setBaseViewPath("/WEB-INF/views");
        // 5、设置上传路径，默认为upload
        // me.setBaseUploadPath("upload");
        // 6、设置下载路径，默认为download
        // me.setBaseDownloadPath("download");
        // 7、设置生成JSON的时间格式
        // me.setJsonDatePattern("yyyy-MM-dd HH:mm:ss");
        // me.setJsonFactory(FastJsonFactory.me());
        // 8、设置日志工厂
        // me.setLogFactory(Slf4JLogFactory.me());
        // 9、...
    }

    /**
     * 配置路由
     */
    @Override
    public void configRoute(Routes me) {
        me.add("/category", CategoryController.class, "/views/category/");
        me.add("/article", ArticleController.class, "/views/article/");
    }

    /**
     * <pre>
     * 配置插件。
     * JFinal内置了activerecord、c3p0、druid、ehcache、redis五款插件，扩展插件需实现IPlugin接口
     * </pre>
     */
    @Override
    public void configPlugin(Plugins me) {
        // 配置C3p0数据库连接池插件
        C3p0Plugin c3p0Plugin = new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
        me.add(c3p0Plugin);

        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
        arp.setShowSql(true);
        me.add(arp);

        // 表和Model映射
        _MappingKit.mapping(arp);
    }

    /**
     * 配置全局拦截器
     */
    @Override
    public void configInterceptor(Interceptors me) {

    }

    /**
     * <pre>
     * 配置处理器
     * 1、Handler优先于Interceptor执行
     * 2、Handler是AOP+责任链模式的变种，链条的末端就是ActionHandler，用来处理动作请求和拦截
     * 3、Handler拦截所有请求（包括静态资源），Interceptor只拦截对Controller的请求
     * 4、在JFinal中，不是特殊的需要是用不到Handler的，普通的拦截请求使用Interceptor即可
     * </pre>
     */
    @Override
    public void configHandler(Handlers me) {
        me.add(new FakeStaticHandler());
    }

    /**
     * JFinal启动后执行的操作
     */
    @Override
    public void afterJFinalStart() {

    }

    /**
     * JFinal停止前执行的操作
     */
    @Override
    public void beforeJFinalStop() {

    }

}
